#!/bin/bash

# 设置脚本在遇到非零退出码时立即停止执行
set -e

# 判断是否启用数据库迁移功能
if [[ "${MIGRATION_ENABLED}" == "true" ]]; then
  # 输出正在运行迁移的信息
  echo "Running migrations"
  # 执行 Flask 数据库升级命令
  flask upgrade-db
fi

# 根据 MODE 环境变量判断运行模式
if [[ "${MODE}" == "worker" ]]; then

  # 获取可用CPU核心数
  if [ "${CELERY_AUTO_SCALE,,}" = "true" ]; then
    # 如果启用了自动扩展，则设置最大和最小工作进程数
    # 获取系统可用的核心数
    AVAILABLE_CORES=$(nproc)
    # 设置最大工作进程数，默认为可用核心数
    MAX_WORKERS=${CELERY_MAX_WORKERS:-$AVAILABLE_CORES}
    # 设置最小工作进程数，默认为1
    MIN_WORKERS=${CELERY_MIN_WORKERS:-1}
    # 构造自动扩展选项参数
    CONCURRENCY_OPTION="--autoscale=${MAX_WORKERS},${MIN_WORKERS}"
  else
    # 如果没有启用自动扩展，则设置固定的工作进程数，默认为1
    CONCURRENCY_OPTION="-c ${CELERY_WORKER_AMOUNT:-1}"
  fi

  # 启动 Celery Worker 进程
  # -A 指定 Celery 应用
  # -P 指定工作池类型，默认为 gevent
  # $CONCURRENCY_OPTION 并发选项（自动扩展或固定数量）
  # --max-tasks-per-child 指定每个子进程处理的最大任务数，默认50
  # --loglevel 日志级别，默认 INFO
  # -Q 指定监听的任务队列
  exec celery -A app.celery worker -P ${CELERY_WORKER_CLASS:-gevent} $CONCURRENCY_OPTION \
    --max-tasks-per-child ${MAX_TASK_PRE_CHILD:-50} --loglevel ${LOG_LEVEL:-INFO} \
    -Q ${CELERY_QUEUES:-dataset,mail,ops_trace,app_deletion}

# 如果模式为 beat（定时任务调度器）
elif [[ "${MODE}" == "beat" ]]; then
  # 启动 Celery Beat 进程，用于定时任务调度
  # -A 指定 Celery 应用
  # --loglevel 日志级别，默认 INFO
  exec celery -A app.celery beat --loglevel ${LOG_LEVEL:-INFO}
else
  # 如果不是 worker 也不是 beat 模式，则作为 Web 服务器运行
  if [[ "${DEBUG}" == "true" ]]; then
    # 如果启用了调试模式，使用 Flask 内置服务器运行应用
    # --host 指定绑定地址，默认 0.0.0.0
    # --port 指定端口，默认 5001
    exec flask run --host=${DIFY_BIND_ADDRESS:-0.0.0.0} --port=${DIFY_PORT:-5001} --debug
  else
    # 生产模式下使用 Gunicorn 作为 WSGI 服务器
    # --bind 指定绑定地址和端口
    # --workers 指定工作进程数，默认 1
    # --worker-class 指定工作进程类型，默认 gevent
    # --worker-connections 指定每个工作进程的连接数，默认 10
    # --timeout 指定请求超时时间，默认 200 秒
    exec gunicorn \
      --bind "${DIFY_BIND_ADDRESS:-0.0.0.0}:${DIFY_PORT:-5001}" \
      --workers ${SERVER_WORKER_AMOUNT:-1} \
      --cc ${SERVER_WORKER_CLASS:-gevent} \
      --worker-connections ${SERVER_WORKER_CONNECTIONS:-10} \
      --timeout ${GUNICORN_TIMEOUT:-200} \
      app:app
  fi
fi